package org.lixf.innerclass;

// 内部类
// 成员内部类(静态、非静态)
// 局部内部类(方法、构造方法、代码块) -> 局部变量(方法、构造方法、代码块)
//OuterClass$1InnerClassC.class
//OuterClass$1InnerClassD.class
//OuterClass$1InnerClassE.class
//OuterClass$InnerClassA.class
//OuterClass$InnerClassA1.class
//OuterClass$InnerClassA2.class
//OuterClass$StaticInnerClassB.class
//OuterClass$StaticInnerClassB1.class
//OuterClass.class
public class OuterClass {

    public static String a = "aa";

    public class InnerClassA {
        public static final String a = "123"; // 非静态内部类中静态域必须是final,外部类的每个对象都可以有非静态内部类的实例。。
        // public final static void aiMethod(){} // 非静态内部类中不能又static方法,java语言规范没有解释
    }

    public void newInnerClassA() {
        InnerClassA innerClassA = this.new InnerClassA();
    }

    //public class OuterClass{} // 内部类的名字不能与包含它的外部类类名相同
    public final class InnerClassA1 {

    }

    public abstract class InnerClassA2 {

    }

    public static class StaticInnerClassB {
        public static void asMethod() {
        } // 只能访问外部类的static
    }

    public static void asMethod(){
        new StaticInnerClassB();
        //new InnerClassA();
    }

    // public abstract static void bMethod();

    public abstract static class StaticInnerClassB1 {

    }

    public OuterClass() {
        class InnerClassC {
        }
    }

    {
        class InnerClassD {
        }
    }

    public void aMethod() {
        String atest = "aaa";// java 8 之前atest必须为final
        //atest = "vvv";// java 8 之后可以不写final，但不能修改atest的值
        class InnerClassE {
            public String a = atest;
            public void aieMethod() {
                System.out.println(atest);
            }
        }
    }

    public void aaMethod() {
        String atest = "aaa";
        // atest = "aaaaa";
        // 匿名内部类
        OuterClassB b = new OuterClassB("aaa") {
            // public OuterClassB(){}// 匿名内部类不能又构造器
            public void test() {
                System.out.println(atest);
                System.out.println(b);
            }
        };
        Class aClass = new OuterClass().getClass();
        System.out.println(aClass);
        System.out.println(b.getClass() == aClass);
        System.out.println(new OuterClass().getClass() == aClass);
    }

    public static void main(String[] args) {
        new OuterClass().aaMethod();
    }
}

class OuterClassB {
    String b;
    public OuterClassB(String b){
    this.b = b;
    }
}

interface OuterInterface{

    class InnerClassA{// public static

    }
}